package com.redoor.app.stake.common.utils;

import com.sun.jna.Library;
import com.sun.jna.Native;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 授权码、桩注册码生成器
 *
 *
 * Created by leoliu on 2017/6/9.
 */
public class TcuRegSvr {

    private static final Logger logger = LoggerFactory.getLogger(TcuRegSvr.class) ;

    public interface Libr extends Library {
        Libr instance = (Libr)Native.loadLibrary("tcu_reg_svr.so", Libr.class) ;


        /**
         * 生成网络注册码
         *
         *
         * @param serial_type  --in，网络注册码类型[1]
         * @param serial_period --in，网络注册码有效期[3]
         * @param soft_period --in，软件有效期[6]
         * @param feature_list --in，功能配置[5]
         * @param id --随机ID号    从 1 开始，最大2147483647
         * @param serial --out,网络注册码 [47]  类似AAAAA-BBBBB-CCCCC-DDDDD-EEEEE-FFFFF-GGGGG-HHHHH
         */
        void generate_serial(int serial_type, byte[] serial_period,
                             byte[] soft_period, char[] feature_list, int id, byte[] serial) ;

        /**
         * 生成授权码
         *
         *
         * @param auth_type --注册码类型[1]
         * @param fingerprint --指纹[16]
         * @param soft_period --软件有效期[6]
         * @param feature_list --功能配置[5]
         * @param asset_code --资产码[8]
         * @param serial --注册码 [41] 类似AAAAA-BBBBB-CCCCC-DDDDD-EEEEE-FFFFF-GGGGG-HHHHH
         * @param auth_code 返回值: auth_code--生成的授权码[59]类似AAAAA-BBBBB-CCCCC-DDDDD-EEEEE-FFFFF-GGGGG-HHHHH-IIIII-JJJJJ
         */
        void generate_auth_code(int auth_type, byte[] fingerprint, byte[] soft_period,
                                char[] feature_list, byte[] asset_code, byte[] serial, byte[] auth_code) ;


        /**
         * 根据客户端传过来的参数生成的指纹与传入的指纹比较
         *
         * @param fingerprint --客户端传入的指纹
         * @param esam_id --传入的ID
         * @param mac --传入的MAC
         * @return 对应返回1；不对应返回0
         */
        int check_fingerprint(String fingerprint, String esam_id, String mac) ;
    }


    /**
     * 生成授权码
     *
     * @param fingerprint - 设备指纹
     * @param stakeNo - 桩编号
     * @param serial - 注册码
     * @param softPeriod - 软件有效期，17-12-31 格式
     * @return
     */
    public static String generateAuthCode(String fingerprint, String stakeNo,
        String serial, String softPeriod){
        logger.debug("gen auth code finger=" + fingerprint + " stakeNo=" + stakeNo + " softPeriod=" + softPeriod + " serial=" + serial); ;
        int authType = 1 ;
        char[] featureList = new char[]{0xff, 0xff, 0xff, 0xff, 0xff} ;
        byte[] authCode = new byte[51] ;
        byte[] softPeriods = ByteUtils.dateToByte(softPeriod) ;
        byte[] asset_code = ByteUtils.str2Bcd(stakeNo) ;
        byte[] finger = ByteUtils.str2Bcd(fingerprint) ;
        byte[] serials = new byte[41] ;
        System.arraycopy(serial.getBytes(), 0, serials, 0, 40) ;
        logger.debug("soft period size=" + softPeriods + " asset code size=" + asset_code.length + " finger size=" + finger.length);
        try{
            Libr.instance.generate_auth_code(authType, finger, softPeriods, featureList,
                asset_code, serials, authCode) ;
        }catch(Exception ex){
            ex.printStackTrace() ;
        }
        logger.debug("gen auth code =" + new String(authCode, 0, 50) + " len=" + new String(authCode).length()); ;
        return new String(authCode, 0, 50) ;
    }

    /**
     * 生成网络注册码
     *
     * @param serailType - 注册码类型，1 - 试用， 2 - 正式
     * @param index - 注册码顺序，从 1 - 2147483647
     * @param serialPeriod - 注册码有效期，2017-12-31 格式
     * @param softPeriodStart - 软件有效期起始日期，2017-06-04 格式
     * @param softPeriodEnd - 软件有效期终止日期，2017-12-31 格式
     * @return
     */
    public static String generateSerial(int serailType, int index, String serialPeriod,
        String softPeriodStart, String softPeriodEnd){

        byte[] serial = new byte[41] ;
        byte[] serial_period = ByteUtils.dateToByte(serialPeriod) ;
        byte[] soft_period = ByteUtils.dateToByte(softPeriodStart + "-" + softPeriodEnd) ;
        char[] feature_list = new char[]{0xff, 0xff, 0xff, 0xff, 0xff} ;
        try{
            Libr.instance.generate_serial(serailType, serial_period, soft_period, feature_list, index, serial) ;
        }catch(Exception ex){
            ex.printStackTrace() ;
        }
        return new String(serial).trim() ;
    }


}
